package annoyField

import "fmt"

/*
方法集
类型T 包含所有receiver T
类型 *T包含所有receiver T和*T
类型S包含T，S包含所有receiver S和T
类型S 包含*T，S包含所有receiver S和T、*T
类型S包含T或*T，*S总是包含receiver S、*S、T和*T
*/

type T struct {
	name string
}

type S1 struct {
	T
	age int
}

type S2 struct {
	*T
	age int
}

// 都可以被调用
func (t T) TestT() {
	fmt.Printf("T: %p, %v\n", &t, t)
}

// *T和S2可以调用
func (t *T) TestxT() {
	fmt.Printf("*T: %p, %v \n", t, t)
}

func Test() {
	s := S1{T{"T"}, 23}
	xs := &s

	st := S2{&T{"T"}, 23}
	xst := &st

	fmt.Printf("创建出来的S1：%p\n", &(s.T))
	fmt.Printf("创建出来的S2：%p\n", st.T)

	// 接受者是T和*T，提升为S1和S2
	s.TestT()
	s.TestxT()
	xs.TestT()
	xs.TestxT()

	st.TestT()
	st.TestxT()
	xst.TestT()
	xst.TestxT()

}
